﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using UricaoWeb.LogicaDeNegocios.Tours;
using UricaoWeb.Datos.Excepciones.Tours;
using UricaoWeb.Datos.ConexionBD.Tours;

using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;

namespace UricaoWeb.Presentacion
{
    /// <summary>
    /// Permite la busqueda y muestra de la informacion previa de tours
    /// </summary>
    public partial class BuscarTour : API_Seguridad_Principal
    {
        private string _alerta = "";
        private int _idHotelRecibido;
        private string _paginaRedireccion = "API_tour_BuscarTour.aspx";

        private List<Tour> _listaTours = new List<Tour>();
        private TourLogica _controlador = new TourLogica();

        /// <summary>
        /// Cargar una nueva página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            var master = Master as MasterPage;
            if (master != null)
            {
                master.actualizar_label();
            }
            base.validar_usuario();

            bool inicio = Inicio();

            if (inicio)
            {
                _listaTours = ConsultarTourCompleta();
                if (!IsPostBack)
                {
                    LlenarGVTours(_listaTours);
                }
            }
            else 
            {
                Redireccion();
            }
            
        }


        /// <summary>
        /// Método de carga inicial para la validacion del usuario
        /// </summary>
        /// <returns>Booleano de inicializacion</returns>
        private bool Inicio()
        {
            Logica_Usuario usuario = (Logica_Usuario)Session["user"];
            bool parsed = false;

            if (usuario != null)
            {
                parsed = Int32.TryParse(usuario.FkHotel, out _idHotelRecibido);
                if (!parsed)
                {
                    Console.WriteLine("Int32.TryParse no pudo realizar la conversion '{0}' a entero (int).\n", usuario.FkHotel);
                    _alerta = "Disculpe, no estamos disponibles en estos momentos";
                    MostrarAlerta();
                    // _paginaRedireccion = "API_Uricao.aspx"; Pagina principal
                }
            }
            else 
            { 
                _paginaRedireccion = "API_Seguridad_Login_.aspx";
                Server.Transfer(_paginaRedireccion, false);
            } 
                
            return parsed;
        }



        /// <summary>
        /// Redirección a otra página según sea indicado
        /// </summary>
        private void Redireccion()
        {
            Response.Redirect(_paginaRedireccion);
        }


        /// <summary>
        /// Cambia el mensaje del label de alerta
        /// </summary>
        private void MostrarAlerta()
        {
            alerta.Text = _alerta;
            alerta.Visible = true;
        }



        #region Consultas al controlador

        /// <summary>
        /// Me devuelve la lista de todos los tours
        /// </summary>
        /// <returns>Lista de tours</returns>
        private List<Tour> ConsultarTourCompleta()
        {
            List<Tour> lista = new List<Tour>();
            try
            {
                lista = _controlador.ConsultarTours(_idHotelRecibido);
                return lista;
            }
            catch (Exception e )
            {
                _alerta = "No se ha podido encontrar itinerario para dicho tour ";
                MostrarAlerta();
            }
            return lista;
        }


        /// Método que devuelve un tour específico
        /// </summary>
        /// <param name="idTour">Id del tour</param>
        /// <returns>Tour especificado</returns>
        private List<Tour> ConsultarTourParametrizado(int idTour)
        {
            List<Tour> lista = new List<Tour>();
            try
            {
                lista = _controlador.ConsultarTour(idTour);
                return lista;
            }
            catch (Exception e)
            {
                _alerta = "No se ha podido encontrar itinerario para dicho tour ";
                MostrarAlerta();
            }
            return lista;
        }


        /// <summary>
        /// Busqueda de tours bajo un parametro específico
        /// </summary>
        /// <param name="parametro">Parametro a buscar</param>
        /// <returns>Lista de tours bajo cierto parametro</returns>
        private List<Tour> BusquedaTours(string parametro)
        {
            List<Tour> lista = new List<Tour>();
            lista = _controlador.BusquedaTours(parametro, _idHotelRecibido);
            return lista;
        }


        #endregion 


        #region Llenado de las tablas

        /// <summary>
        /// Método que llena el GridView del ConsultarTours.aspx
        /// </summary>
        private void LlenarGVTours(List<Tour> lista)
        {
            try
            {
                LiberarGVTours();
                if (lista != null)
                {
                    GvTours.DataSource = lista;
                    GvTours.DataBind();
                }
                else
                {
                    _alerta = "No se ha encontrado tour(s)";
                    MostrarAlerta();
                }
            }
            catch (HttpException e) { throw new ExcepcionesTours("Error de Http", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
        }

        /// <summary>
        /// Método que libera el GridView del ConsultarTours.aspx
        /// </summary>
        private void LiberarGVTours()
        {
            try
            {
                GvTours.DataSource = null;
                GvTours.DataBind();
            }
            catch (HttpException e) { throw new ExcepcionesTours("Error de Http", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }

        }

        /// <summary>
        /// Buscador de tours según los parámetros 
        /// ingresado a consultar
        /// </summary>
        private void Buscardor()
        {
            string input = InputBuscar.Text;

            if (input.Equals(" "))
            {
                LlenarGVTours(ConsultarTourCompleta());
            }
            else
            {
                LlenarGVTours(BusquedaTours(input));
            }
        }

        #endregion 


        #region Metodos llamados del template

        /// <summary>
        /// Método que es llamado al seleccionarse
        /// la visualización de un tour (Ver)
        /// </summary>
        /// <param name="sender">Objeto</param>
        /// <param name="e">Evento</param>
        protected void GvToursSelectedIndexChanged(object sender, EventArgs e)
        {
                     
        }

        /// <summary>
        /// Método que es llamado al seleccionarse
        /// el cambio de la página.
        /// Paginación de la tabla
        /// </summary>
        /// <param name="sender">Objeto</param>
        /// <param name="e">Evento</param>
        protected void GvToursPageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GvTours.PageIndex = e.NewPageIndex;
            Buscardor();
        }

        /// <summary>
        /// Buscador que se activa al cambiarse
        /// el texto en el input
        /// </summary>
        /// <param name="sender">Objeto</param>
        /// <param name="e">Evento</param>
        protected void BuscadorTextChanged(object sender, EventArgs e)
        {
            Buscardor();
        }

       

        /// <summary>
        /// Acciones que se pueden ejecutar en el GridView
        /// </summary>
        protected void GvToursRowCommand(object sender, GridViewCommandEventArgs e)
        {
            string redireccion = "";

            if (e.CommandName == "Modificar")
            {
                redireccion = "API_tour_ModificarTour.aspx";
            }
            else 
            {
                if (e.CommandName == "Ver")
                {
                    redireccion = "API_tour_ConsultarTour.aspx";
                }
            }

            if (redireccion != "")
                RedireccionamientoDeComandos(redireccion, e);
        }

        private void RedireccionamientoDeComandos(string url, GridViewCommandEventArgs e)
        {
            int indiceSeleccionado;
            int idTour;
            string idValue;
            bool parsed = false;

            indiceSeleccionado = Convert.ToInt32(e.CommandArgument);
            idValue = GvTours.DataKeys[indiceSeleccionado].Value.ToString();
            parsed = Int32.TryParse(idValue, out idTour);
            Session["idTour"] = idTour;
            
            if (!parsed)
                Console.WriteLine("Int32.TryParse no pudo realizar la conversion '{0}' a entero (int).\n", idValue);
            else
            {
                Response.Redirect(url);
            }
        }


        #endregion

    }
}